using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 【2D物体朝向鼠标组件】
/// 适用场景：2D角色或UI元素需要跟随鼠标旋转，可选角度限制和自动左右翻转
/// 功能：
/// - 鼠标在范围内时，物体朝向鼠标
/// - 可设置角度偏移（适配默认朝向）
/// - 可限制最大旋转角度
/// - 可自动左右翻转（通过scale）
/// </summary>
[DisallowMultipleComponent] //确保一个GameObject上只能存在一个具有标记了该特性的脚本,防止在同一个GameObject上重复添加同一个脚本，以避免可能引发的问题
public class FaceMouse2D : MonoBehaviour
{
    [Header("旋转设置")]
    [Tooltip("图片默认朝向与X轴夹角（如默认朝上就填90）")]
    [SerializeField] private float angleOffset = 90f;

    [Header("范围设置")]
    [Tooltip("只有鼠标在多少距离内才朝向旋转")]
    [SerializeField] private float lookRadius = 999f;

    [Header("翻转设置")]
    [Tooltip("是否自动左右翻转 Scale")]
    [SerializeField] private bool flipWithMouse = false;

    [Header("角度限制")]
    [Tooltip("是否限制最大可旋转角度范围")]
    [SerializeField] private bool limitAngle = false;

    [Tooltip("最大可偏转角度范围（±值，例如60表示最大左转60°、右转60°）")]
    [SerializeField] private float maxAngle = 60f;

    private Camera cam;                    // 主摄像机引用
    private Vector3 originalScale;        // 初始缩放，用于翻转恢复

    private void Awake()
    {
        cam = Camera.main;

        originalScale = transform.localScale;
    }

    private void Update()
    {
        // 获取鼠标在世界空间中的位置
        Vector3 mousePos = cam.ScreenToWorldPoint(Input.mousePosition);

        float distance = Vector2.Distance(transform.position, mousePos);

        if (distance < lookRadius)
        {
            // 计算从物体到鼠标的方向向量
            Vector2 direction = (mousePos - transform.position);

            // 计算角度（注意Atan2的顺序）
            float angleToMouse = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

            float targetAngle = angleToMouse + angleOffset;

            // 限制角度
            if (limitAngle)
                targetAngle = Mathf.Clamp(targetAngle, -maxAngle, maxAngle);

            transform.rotation = Quaternion.Euler(0, 0, targetAngle);

            // 可选：左右翻转
            if (flipWithMouse)
            {
                Vector3 scale = originalScale;
                scale.x = (direction.x >= 0) ? Mathf.Abs(scale.x) : -Mathf.Abs(scale.x);
                transform.localScale = scale;
            }
        }
    }

    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.yellow;
        Gizmos.DrawWireSphere(transform.position, lookRadius);
    }
}
